package api

import (
	"fmt"
	"jgt-oper/src/bll"
	"jgt-oper/src/context"
	"jgt-oper/src/schema"

	"github.com/spf13/viper"
)

// User 用户管理
type User struct {
	UserBll       *bll.User       `inject:""`
	LoginBll      *bll.Login      `inject:""`
	EnterpriseBll *bll.Enterprise `inject:""`
}

// UpdateRegister 更新注册信息
func (a *User) UpdateRegister(ctx *context.Context) error {
	ctx.WriteOperateLog("User.UpdateRegister", "更新注册信息")
	var reqData schema.UpdateUserRegisterInfo
	if err := ctx.ParseJSON(&reqData); err != nil {
		return ctx.ResErrBadRequest(err)
	}

	exists, err := a.UserBll.CheckNickname(ctx.GetUserID(), reqData.Nickname)
	if err != nil {
		return ctx.ResErrInternalServer(err)
	} else if exists {
		return ctx.ResErrBadRequest(fmt.Errorf("昵称已经存在"))
	}

	err = a.UserBll.UpdateRegisterInfo(ctx.GetUserID(), &reqData)
	if err != nil {
		return ctx.ResErrInternalServer(err)
	}
	return ctx.ResOK()
}

// QueryDiscoverMenu 查询发现页菜单
func (a *User) QueryDiscoverMenu(ctx *context.Context) error {
	items, err := a.LoginBll.QuerySystemMenuByUserID(ctx.GetUserID(), viper.GetString("mobile_discover_tag"))
	if err != nil {
		return ctx.ResErrInternalServer(err)
	}

	return ctx.ResSuccess(items)
}

// QueryMyFunctionMenu 查询我的功能菜单
func (a *User) QueryMyFunctionMenu(ctx *context.Context) error {
	items, err := a.LoginBll.QuerySystemMenuByUserID(ctx.GetUserID(), viper.GetString("mobile_my_tag"))
	if err != nil {
		return ctx.ResErrInternalServer(err)
	}

	return ctx.ResSuccess(items)
}

// SaveCommonFunction 保存常用功能项
func (a *User) SaveCommonFunction(ctx *context.Context) error {
	ctx.WriteOperateLog("User.SaveCommonFunction", "保存常用功能项")

	var reqData struct {
		Functions []string `json:"functions"` // 功能项ID
	}
	if err := ctx.DecodeJSON(&reqData); err != nil {
		return ctx.ResErrBadRequest(err)
	}

	err := a.UserBll.SaveCommonFunction(ctx.GetUserID(), reqData.Functions)
	if err != nil {
		return ctx.ResErrInternalServer(err)
	}

	return ctx.ResOK()
}

// Auth 用户认证
func (a *User) Auth(ctx *context.Context) error {
	ctx.WriteOperateLog("User.Auth", "用户认证")

	var reqData schema.AuthHistory
	if err := ctx.ParseJSON(&reqData); err != nil {
		return ctx.ResErrBadRequest(err)
	}

	reqData.UserID = ctx.GetUserID()
	err := a.UserBll.Auth(&reqData)
	if err != nil {
		return ctx.ResErrInternalServer(err)
	}

	return ctx.ResOK()
}

// Get 获取用户信息
func (a *User) Get(ctx *context.Context) error {
	item, err := a.UserBll.Get(ctx.Param("id"))
	if err != nil {
		return ctx.ResErrInternalServer(err)
	} else if item == nil {
		return ctx.ResErrBadRequest(fmt.Errorf("无效的用户"))
	}

	info := make(map[string]interface{})
	info["nickname"] = item.Nickname
	info["gender"] = item.Gender
	info["post"] = item.Post
	info["auth_status"] = item.AuthStatus
	info["user_type"] = item.UserType
	if item.EnterpriseID != "" {
		eitem, err := a.EnterpriseBll.Get(item.EnterpriseID)
		if err != nil {
			return ctx.ResErrInternalServer(err)
		} else if item != nil {
			info["enterprise_name"] = eitem.Name
		}
	}

	return ctx.ResSuccess(info)
}

// WriteOff 用户注销
func (a *User) WriteOff(ctx *context.Context) error {
	ctx.WriteOperateLog("Users.WriteOff", "一般用户注销")

	var (
		userID string
		user   *schema.User
		err    error
	)
	userID = ctx.GetUserID()
	user, err = a.UserBll.Get(userID)
	if err != nil {
		return ctx.ResErrInternalServer(err)
	}
	if user.AuthStatus == 1 {
		return ctx.ResErrBadRequest(fmt.Errorf("认证用户需要手机验证方能注销"))
	}

	err = a.UserBll.WriteOff(userID)
	if err != nil {
		return ctx.ResErrInternalServer(err)
	}
	return ctx.ResOK()
}

// SaveSetting 保存用户设置
func (a *User) SaveSetting(ctx *context.Context) error {
	var reqData schema.UserSettingItem
	if err := ctx.ParseJSON(&reqData); err != nil {
		return ctx.ResErrBadRequest(err)
	}

	err := a.UserBll.SaveSetting(ctx.GetUserID(), &reqData)
	if err != nil {
		return ctx.ResErrInternalServer(err)
	}

	return ctx.ResOK()
}
